package game;

/**
 * Calcule le type de comportements asymptotiques d'un jeu et donne la valeur de
 * ses caracteristiques
 */
public class Comportement {

	/**
	 * Periode calcule la taille de la periode
	 * 
	 * @param p
	 *            : plateau de jeu
	 * @param stop
	 *            : temps maximale du calcul de la periode
	 * @return la taille de la periode
	 */
	public static int Periode(Plateau p, int stop) {
		int cpt = 1;
		if (p.getJeu().size() == 0) {
			System.out.println("Etat mort");
			return 0;
		}

		Plateau p2 = new Plateau(p.getJeu(), p.getVie(), p.getMort());
		Plateau p3 = new Plateau(p.getJeu(), p.getVie(), p.getMort());
		p3.setJeu(Modification.simu(p3));

		while (cpt > 0 && !Plateau.compareList(p2.getJeu(), p3.getJeu())) {
			p2.setJeu(Modification.simu(p2));
			p3.setJeu(Modification.simu(p3));
			p3.setJeu(Modification.simu(p3));
			cpt++;
			if (cpt == stop) {
				cpt = -1;
			}
			if (p2.getJeu().size() == 0 || p3.getJeu().size() == 0) {
				System.out.println("Etat mort");
				return 0;
			}
		}
		System.out.println(cpt + " la première periode");

		Plateau p4 = new Plateau(p2.getJeu(), p.getVie(), p.getMort());
		if (Plateau.compareList2(p2.getJeu(), Modification.simu(p4))) {
			System.out.println("Etat stable");
			cpt = -2; 
			return 1;
		}

		if (cpt == -1) {
			System.out.println("Rien trouvé");
			return -1;
		}

		int cpt1 = cpt;
		while (cpt > 0 && cpt1 == cpt) {
			cpt1 = cpt;
			cpt = Periode_bis(p2, cpt);
		}
		if (cpt > 0) {
			cpt = cpt + 1;
		} else {
			cpt = cpt1 + 1;
		}
		System.out.println(cpt + " La deuxième periode");
		return cpt;
	}

	/**
	 * Periode calcule la taille de la periode
	 * 
	 * @param p
	 *            : plateau de jeu
	 * @param stop
	 *            : temps maximale du calcul de la periode
	 * @return la taille de la periode
	 */
	public static int Periode_bis(Plateau p, int stop) { 
		int cpt = 0;
		Plateau p2 = new Plateau(p.getJeu(), p.getVie(), p.getMort());
		p2.setJeu(Modification.simu(p2));
		while (cpt >= 0 && !Plateau.compareList(p.getJeu(), p2.getJeu())) {
			p.setJeu(Modification.simu(p));
			p2.setJeu(Modification.simu(p2));
			p2.setJeu(Modification.simu(p2));
			if (cpt == stop) {
				cpt = -1;
				return cpt;
			}
			cpt++;
		}
		return cpt;
	}

	/**
	 * Calcule la taille de la queue
	 * 
	 * @param p
	 *            : plateau de jeu
	 * @param periode
	 *            : periode de deroulement du jeu
	 * @return la taille de la queue
	 */
	public static int Queue(Plateau p, int periode) {
		Plateau pclone = new Plateau(p.getJeu(), p.getVie(), p.getMort());
		int i = 0;
		while (i < periode) {
			pclone.setJeu(Modification.simu(pclone));
			i++;
		}
		int queue = 1;
		while (!Plateau.compareList(p.getJeu(), pclone.getJeu())) {
			p.setJeu(Modification.simu(p));
			pclone.setJeu(Modification.simu(pclone));
			queue++;
		}
		if (Plateau.compareList2(p.getJeu(), pclone.getJeu())) {
			System.out.println("C'est un oscillateur");
		} else {
			System.out.println("C'est un vaisseau");
		}
		return queue;
	}

	/**
	 * Calcule la taille de la queue d'un jeu mort
	 * 
	 * @param p
	 *            : plateau de jeu
	 * @return la taille de la queue
	 */
	public static int Queue_mort(Plateau p) {
		int queue = 1;
		while (p.getJeu().size() != 0) {
			p.setJeu(Modification.simu(p));
			queue++;
		}
		return queue;
	}

	/**
	 * Calcule la taille de la queue d'un jeu stable
	 * 
	 * @param p
	 *            : plateau de jeu
	 * @return la taille de la queue
	 */
	public static int Queue_stable(Plateau p) {
		Plateau pclone = new Plateau(p.getJeu(), p.getVie(), p.getMort());
		pclone.setJeu(Modification.simu(pclone));
		int queue = 1;
		while (!Plateau.compareList(p.getJeu(), pclone.getJeu())) {
			p.setJeu(Modification.simu(p));
			pclone.setJeu(Modification.simu(pclone));
			queue++;
		}
		return queue;
	}

	/**
	 * affiche la periode et la queue d'un jeu
	 * 
	 * @param p
	 *            : plateau de jeu
	 * @param stop
	 *            : nombre d'etape du deroulement du jeu
	 */
	public static void etape6(Plateau p, int stop) {
		int periode = Periode(p, stop);
		int queue;
		if (periode == 0) {
			queue = Queue_mort(p);
		} else {
			if (periode == 1) {
				queue = Queue_stable(p);
			} else {
				if (periode > 0) {
					queue = Queue(p, periode);
				} else {
					queue = 0;
				}
			}
		}
		System.out.println("La queue est : " + queue + " et la pèriode est :"
				+ periode);

	}
}